[따배쿠] 아키텍처 & 네임스페이스


쿠버네티스의 동작방식과 네임스페이스 구조를 알아봅시다!

쿠버네티스 아키텍처

2  쿠버네티스 아키텍처
  1. 쿠버네티스에 사용할 컨테이너 이미지를 저장소에 이미지 push

    • 컨테이너 이미지 저장소는 사내망이 될 수도, 도커허브처럼 퍼블릭 공간도 될 수 있습니다.
  2. 사용자가 control-plane 노드에서 kubectl의 yaml 형태든, CLI 형태든 명령어를 입력하게 되면,
  3. REST API Server가 명령어를 받아서 명령어에 맞게 요청을 받음
  4. etcd의 상태 정보를 확인
  5. 이때 어느 노드에 배치하는 것이 가장 좋은지 판단 및 배치 해주는 것이 Scheduler 입니다. 스케줄러는 REST API Server에게 적절하게 판단해 응답
  6. 응답 받은 값을 가지고 REST API Server는 해당하는 노드의 kubelet에게 요청
  7. 요청을 받은 kubelet은 해당 명령어를 실제 컨테이너 엔진을 담당하는 docker 데몬 전달

    • docker 명령어로 변환해서 docker에게 보내줍니다.
  8. 도커 데몬은 최종적으로 이미지 저장소에서 지정한 컨테이너를 불러와 실행
  9. 컨트롤러는 지속적으로 감시해 파드 개수를 보장

쿠버네티스 컴포넌트

💡

알아두기

모든 컴포넌트는 마스터 노드의 API Server를 거쳐 운영됩니다.

  • etcd

    • 쿠버네티스의 자원 및 상태를 저장하는 컴포넌트
    • key:value 형태로 상태를 저장함
    • kubelet안에는 cAdvisor가 있는데 워커노드의 상태정보를 모니터링하고, 해당 정보를 마스터노드의 REST API server에 전달 후 etcd에 전달
  • schduler

    • 자원을 실행시킬 적절한 워커노드를 선정 후, REST API Server 반환
  • controller

    • 정의된 자원의 수만큼 유지되도록 모니터링 및 장애 발생 시 대응하도록 하는 컴포넌트

Namespace 란 ?

  • 물리적으로 하나의 클러스터(서버) 내에서 네임스페이스를 통해 논리적으로 구분해 줄 수 있습니다.
  • K8S API 종류 중 하나

    • 클러스터 하나를 여러 개의 논리적인 단위로 나눠서 사용
    • 용도에 따라 실행해야 하는 앱을 구분할 때 사용
  • 클러스터를 구성하게 되면 기본적으로 4개의 네임스페이스가 존재하고, 미설정 시 기본 네임스페이스를 사용
💡

알아두면 좋은 정보!

kubectl get pod(파드가 없는 상태에서) 명령어 실행 시, No resources found in default namespace.
메시지를 볼 수 있는데 이는 네임스페이스를 지정해주지 않을 시, 기본 네임스페이스를 사용한다는 것을 유추할 수 있습니다.

조금 더 자세히 알아보기

  • [nginx.yaml] 파일로 만들기
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    - image: nginx:1.14
      name: nginx
      ports:
        - containerPort: 80
        - containerPort: 443
  • yaml 파일로 실행 및 확인

    • 아무 옵션도 주지 않았으므로 default 네임스페이스에 생성됨
$ kubectl create -f nginx.yaml
$ kubectl get pods
  • blue 네임스페이스 생성
$ kubectl create namespace blue
  • orange 네임스페이스에 yaml 파일로 생성 & 실행

    • --dry-run 옵션은 실제로 실행하지 않고, 실행여부를 확인
$ kubectl create namespace orange --dry-run -o yaml > orange-ns.yaml
$ kubectl create -f orange-ns.yaml -n orange
  • blue 네임스페이스에서 실행하기
$ kubectl create -f nginx.yaml -n blue
  • yaml.metadata 에 네임스페이스를 지정해 실행
apiVersion: v1
kind: Pod
metadata:
  name: mypod
  namespace: orange # 네임스페이스 지정
spec:
  containers:
    - image: nginx:1.14
      name: nginx
      ports:
        - containerPort: 80
        - containerPort: 443

이처럼 CLI, yaml 2가지의 방식을 통해 실행할 수 있습니다.

기본 네임스페이스를 변경하기

  • context를 사용자가 config에 등록하여 default 클러스터를 스위칭할 수 있습니다.
  • config 명령어를 통해 기본 context 정보 확인
$ kubectl config view

1  context 등록

  • config set-context 명령어를 통해 새로운 context를 추가

    • blue : 이름
    • —cluster= 클러스터 이름
    • —user : 쿠버네티스 유저
    • —namespace : 지정할 네임스페이스
$ kubectl config set-context blue --cluster=kubernetes --user=kubernetes-admin --namespace=blue
  • 기본 네임스페이스를 blue 네임스페이스로 변경
$ kubectl config use-context blue
  • 현재 지정된 네임스페이스 확인

    • 파드들을 생성할 때 아무 옵션을 주지 않는다면, 이제 blue 네임스페이스에 생성됩니다.
$ kubectl config current-context
  • 다시 원래 default 네임스페이스로 돌리기
$ kubectl config use-context kubernetes-admin@kubernetes
  • 네임스페이스 삭제
$ kubectl delete namespace blue
💡

주의사항!

하나의 네임스페이스 안에 여러 리소스가 존재하게 되는데, 네임스페이스를 지우게 된다면 안에 있는 리소스 모두 같이 삭제됩니다.

Reference

쿠버네티스 공홈 컴포넌트
쿠버네티스 아키텍처


Hello, I'm@nickhealthy
개발자를 꿈꾸고, 파이썬과 클라우드에 관심이 많은 비전공자

Github